package repository

import (
	"context"
	"github.com/minio/minio-go/v7"
	"mime/multipart"
	"net/http"
)

// MinioRepository minio服务接口
type MinioRepository interface {
	// Upload 上传单个文件
	//
	// 参数
	//
	//   - ctx (context.Context): 上下文
	//   - form (*multipart.Form): 表单对象
	//   - bucketName (string): 桶名称
	//
	// 返回
	//
	//   - string: 文件访问URL
	//   - error: 错误信息
	Upload(ctx context.Context, form *multipart.Form, bucketName string) (string, error)

	// UploadFiles 上传多个文件
	//
	// 参数
	//
	//   - ctx (context.Context): 上下文
	//   - form (*multipart.Form): 表单对象
	//   - bucketName (string): 桶名称
	//
	// 返回
	//
	//   - []string: 文件访问URL切片
	//   - error: 错误信息
	UploadFiles(ctx context.Context, form *multipart.Form, bucketName string) ([]string, error)

	// UploadPrefix 上传文件
	//
	// 参数
	//
	//   - ctx (context.Context): 上下文
	//   - form (*multipart.Form): 表单对象
	//   - bucketName (string): 桶名称
	//
	// 返回
	//
	//   - []string: 文件访问URL切片
	//   - error: 错误信息
	UploadPrefix(ctx context.Context, form *multipart.Form, bucketName string) ([]string, error)

	// Delete 删除文件
	//
	// 参数
	//
	//   - ctx (context.Context): 上下文
	//   - bucketName (string): 桶名称
	//   - nameList ([]string): 文件名称切片
	//
	// 返回
	//
	//   - int64: 结果条数
	//   - error: 错误信息
	Delete(ctx context.Context, bucketName string, nameList []string) (int64, error)

	GetStatObject(ctx context.Context, bucketName, objectName string) (minio.ObjectInfo, error)

	// FileInputByte 获取文件字节
	//
	// 参数
	//
	//   - ctx (context.Context): 上下文
	//   - bucketName (string): 桶名称
	//   - name (string): 文件名称
	//
	// 返回
	//
	//   - []byte: 字节
	//   - error: 错误信息
	FileInputByte(ctx context.Context, writer http.ResponseWriter, bucketName string, objectName, dstFile string, size int64) ([]byte, int64, error)

	DownloadObjectWithResume(ctx context.Context, bucketName, objectName, dstPath string, partSize int64) error

	DownloadResponseWithResume(ctx context.Context, w http.ResponseWriter, bucketName, objectName string, cacheSize int64) error

	// DownloadObjectListToZip 下载文件并生成ZIP流
	//
	// 参数
	//
	//   - ctx context.Context: 上下文，用于取消或超时控制
	//   - w io.Writer: 响应写入器，ZIP文件将写入其中
	//   - bucketName (string): 桶名称
	//   - objectList ([]string): 文件名切片，要下载的对象列表
	//   - cacheSize (int64): 缓冲区大小（字节），建议设置 64*1024
	//
	// 返回
	//
	//   - error: 返回错误
	DownloadObjectListToZip(ctx context.Context, w http.ResponseWriter, bucketName string, objectList []string, cacheSize int64) error

	// DownloadObjectListToZipParallel 并行下载文件并生成ZIP流
	//
	// 参数
	//
	//   - ctx context.Context: 上下文，用于取消或超时控制
	//   - w io.Writer: 响应写入器，ZIP文件将写入其中
	//   - bucketName (string): 桶名称
	//   - objectList ([]string): 文件名切片，要下载的对象列表
	//   - cacheSize (int64): 缓冲区大小（字节），建议设置 64*1024
	//   - concurrency (int64): 并行下载数量，控制同时下载的文件数
	//
	// 返回
	//
	//   - error: 返回错误
	DownloadObjectListToZipParallel(ctx context.Context, w http.ResponseWriter, bucketName string, objectList []string, cacheSize, concurrency int64) error
}
